DAG Template
依存関係に基づいたグラフ構造で実行順序を定義できる
依存関係のないタスクは即時実行される
例
code:yaml
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: dag-example-
spec:
entrypoint: main
templates:
- name: main
dag:
tasks:
- name: A
template: echo
arguments:
- name: B
template: echo
depends: "A" # A の後に B
arguments:
- name: C
template: echo
depends: "A" # A の後に C (B と C は並列)
- name: D
template: echo
depends: "B && C" # B と C が両方 Succeeded になったら D
- name: echo
inputs:
container:
image: alpine
これで以下の DAG になる:
code:_
A
/ \
B C
\ /
D
よく使うパターン
1. 分岐 (条件付き実行)
when: で式評価。depends で順序、when で実行可否を分ける。
code:yaml
- name: deploy-prod
depends: "test"
when: "{{workflow.parameters.env}} == prod"
template: deploy
ここで when が false になると deploy-prod は Skipped。後続の depends は Skipped を拾わないと走らないので注意。
2. ファンアウト (withParam)
配列を受け取って並列展開する。
code:yaml
- name: list
template: get-items # outputs.parameters.items に JSON 配列を出す
- name: process
depends: "list"
template: process-one
arguments:
withParam: "{{tasks.list.outputs.parameters.items}}"
- name: summarize
depends: "process" # process は内部で N 並列、全部終わると次へ
template: summarize
配列が 空 [] だと process は Skipped になるので、summarize の depends で Skipped を拾うか、別ルートで list に直接依存させる。
3. 失敗後のクリーンアップ
code:yaml
- name: cleanup
depends: "main-job.Succeeded || main-job.Failed || main-job.Errored"
template: cleanup-resources
これで main-job の結果に関係なく必ずクリーンアップが走る。
4. exit handler との使い分け
「成否によらず必ず最後に走らせたい」だけなら DAG 内で書くより onExit のほうがきれい。
code:yaml
spec:
entrypoint: main
onExit: cleanup # Workflow 全体が終わると必ず呼ばれる
templates:
- name: cleanup
...
DAG 内の cleanup は「グラフの一部としての分岐」、onExit は「Workflow 全体の後始末」と使い分ける。
タスク間でのデータ受け渡し
parameter (小さい値)
code:yaml
- name: producer
template: gen-id
# gen-id は outputs.parameters.id を出す
- name: consumer
depends: "producer"
template: use-id
arguments:
parameters:
- name: id
value: "{{tasks.producer.outputs.parameters.id}}"
artifact (ファイル)
code:yaml
- name: consumer
depends: "producer"
arguments:
artifacts:
- name: data
from: "{{tasks.producer.outputs.artifacts.data}}"
直前タスクのステータス参照
code:yaml
- name: branch
depends: "main.Succeeded || main.Failed"
when: "{{tasks.main.status}} == Failed"
{{tasks.<name>.status}} で文字列として読める。デバッグや分岐に便利。
グラフを組むときの注意
1. 循環は不可。A → B → A のような閉路はバリデーションで弾かれる。
2. タスク名はテンプレ内で一意。{{tasks.X.outputs...}} で参照されるキーになる。
3. depends 式で参照するタスクは同じ DAG 内にいる必要がある。ネストした DAG の中までは見えない。
4. exit-handler 用の onExit フィールドは DAG タスク単位にも書ける。タスク終了時の後処理を仕込める。
code:yaml
- name: critical
template: do-work
onExit: notify-slack
5. 並列度の制限は parallelism: で。デフォルトは無制限なので大量ファンアウト時は要設定。
code:yaml
- name: main
dag:
parallelism: 5 # 同時実行 5 タスクまで
デバッグ Tips
argo get <wf> でタスクの依存関係とステータスをツリー表示
argo logs <wf> -f で全タスクのログ追跡
進まないときの定番:
親が Skipped で depends 式に該当せず子が起動していない
when: が false で Skipped 連鎖
withParam の配列が空